package com.lollipop.rabbitmqspringboot.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.time.LocalDateTime;

/**
 * @Author: Lollipop
 * @Date: 2021-10-10 12:42
 * @Description:
 */
@RestController
@RequestMapping("ttl")
@Slf4j
public class SendMsgController {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping("sendExpirationMsg/{msg}")
    public void sendMsg(@PathVariable String msg) {
        log.info("当前时间：{}，发送1条消息给2个TTL队列：{}", LocalDateTime.now().toString(), msg);
        rabbitTemplate.convertAndSend("X", "XA", "消息来自TTL为10s的QA");
        rabbitTemplate.convertAndSend("X", "XB", "消息来自TTL为40s的QB");
    }

    /**
     * 由消息生产者指定延迟时间，不在队列声明时指定
     * PS：在分别发送2条消息（第1条TTL 20s，第2条TTL5s），出现问题：按道理应该第2条先接收到，再接收到第1条，但是结果却不是
     * 因为RabbitMQ只会检查第1个消息是否过期，过期则丢到死信队列，若第1个消息延迟很长，第2个延迟很短，第2条也不会先执行
     *
     * @param msg
     * @param ttlTime
     */
    @GetMapping("sendExpirationMsg/{msg}/{ttlTime}")
    public void sendMsg(@PathVariable String msg, @PathVariable String ttlTime) {
        log.info("当前时间：{}，发送1条消息时长为{}给QC队列：{}", LocalDateTime.now().toString(), ttlTime, msg);
        rabbitTemplate.convertAndSend("X", "XC", msg, m -> {
            // 设置延迟时间
            m.getMessageProperties().setExpiration(ttlTime);
            return m;
        });
    }
    //（由于没有当前使用的RabbitMQ没有安装延迟插件，先注释掉避免项目启动报错）
    //@GetMapping("sendExpirationMsg/{msg}/{delayTime}")
    //public void sendMsg(@PathVariable String msg, @PathVariable Integer delayTime) {
    //    log.info("当前时间：{}，发送1条消息时长为{}给QC队列：{}", LocalDateTime.now().toString(), delayTime, msg);
    //    rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME, DelayedQueueConfig.DELAYED_QUEUE_ROUTING_KEY, msg, m -> {
    //        // 设置延迟时间
    //        m.getMessageProperties().setDelay(delayTime);
    //        return m;
    //    });
    //}
}
